//
//  MolonAPI.h
//
//  Created by Molon on 13-10-4.
//  Copyright (c) 2013年 Molon. All rights reserved.
//

#import "AFHTTPRequestOperationManager.h"

/**
 *  一般发生了系统级错误，其实就是网络状态不良啊什么的
 */
#define kMolonAPISystemErrorCode 0xFFFF

extern NSString * const MolonAPIRequestHelperStateUpdatedNotificationNamePrefix;

@class MolonRequestHelper,ServiceURL;

/**
 *  请求类delegate
 */
@protocol MolonAPIDelegate <NSObject>

@required

/**
 *  去登录，一般是去登录页面
 */
- (void)gotoLogin;

/**
 *  登录请求的class，以便MolonAPI内部知晓登录成功记录SESSIONID，注意如果后端验证已经登录了，也是要这样返回，而不是返回错误。
 */
- (Class)LoginRequestHelperClass;

/**
 *  注销请求的class
 */
- (Class)LogoutRequestHelperClass;

/**
 *  没登陆的错误码，例如session无效时候的错误码
 */
- (NSInteger)notLoginErrorCode;

/**
 *  接口地图文件的名称
 */
- (NSString*)apiMapPlistPath;

/**
 *  通用的对必须执行的方法的处理
 */
- (void)commonMustExecuteAfterRequestCompleted:(MolonRequestHelper*)requestHelper bindObject:(id)bindObject;

/**
 *  通用的对请求失败的处理
 */
- (void)commonAfterRequestFailedWithHelper:(MolonRequestHelper*)requestHelper bindObject:(id)bindObject;

/**
 *  对结果是否成功的判断
 */
- (BOOL)isSuccessWithResponseObject:(id)responseObject;

/**
 *  错误信息的反馈，格式得确定,类似 @{@"message":@"xxxx",@"code":@(1024)};
 */
- (NSDictionary*)errorWithResponseObject:(id)responseObject;

/**
 *  成功后的结果，取出有效数据，返回值可能是NSArray或者NSDictionary，不可为其他
 */
- (id)successResultDataWithResponseObject:(id)responseObject;

/**
 *  对url可以进行一些自定义
 */
- (void)doCustomWithServiceUrl:(ServiceURL*)serviceUrl;

@optional

/**
 *  其他的一些系统级，即每个请求都会添加的参数
 */
- (NSDictionary*)otherSystemParameters;

/**
 *  在登录请求成功之后外部需要执行的方法
 */
- (void)doAfterLoginSuccessWithHelper:(MolonRequestHelper*)requestHelper;

/**
 *  在注销请求成功之后外部需要执行的方法
 */
- (void)doAfterLogoutSuccessWithHelper:(MolonRequestHelper*)requestHelper;

/**
 *  自定义最后处理请求体，可以去除原加密，在此处搞自己的加密
 */
- (void)customAfterCreatingRequestParams:(NSMutableDictionary*)parameters;

/**
 *  在登录之后是否需要重试，默认为YES
 */
- (BOOL)needRetryRequestHelpersAfterLogin;

@end

/**
 *  请求的完整URL记录，并且标记其是否需要登录验证才可调用
 */
@interface ServiceURL : NSObject

@property (nonatomic, copy) NSString *url;
@property (nonatomic) BOOL isNeedLogin;
@property (nonatomic, copy) NSString *requestMethod; //默认POST

@end

/**
 *  请求类
 */
@interface MolonAPI : AFHTTPRequestOperationManager

@property (nonatomic, weak) id<MolonAPIDelegate> delegate;

/**
 *  sessionID,有值代表已经登录
 */
@property (nonatomic, copy,readonly) NSString *sessionID;

/**
 *  当前服务器地址，这个在运行中需要改变时候才外部修改，一般以MolonServiceAPIMap.plist初始化
 */
@property (nonatomic, copy) NSString *hostName;

/**
 *  单例
 *
 *  @return 单例
 */
+ (instancetype)sharedInstance;

/**
 *  发起一次请求
 *
 *  @param requestHelper 请求体
 */
+ (void)requestWithHelper:(MolonRequestHelper *)requestHelper andBindObject:(id)bindObject;

/**
 *  发起一个可监视上传进度的请求
 *
 *  @param requestHelper 请求体
 *  @param uploadBlock   上传进度block
 */
+ (void)requestWithHelper:(MolonRequestHelper *)requestHelper andBindObject:(id)bindObject uploadProgressBlock:(void (^)(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite))uploadBlock;

/**
 *  取消一个请求
 */
+ (void)cancelRequestHelper:(MolonRequestHelper*)requestHelper;

/**
 *  是否处于登录状态
 */
+ (BOOL)isLogined;

/**
 *  清空登录后的重试请求，一般是在登录页面的跳过按钮需要调用
 */
+ (void)clearRetryHelpersAfterLogin;

//常规的配置
/**
 *  是否开启缓存，此项会在release下忽略，release下肯定为YES,默认为YES
 */
@property (nonatomic, assign) BOOL requestCacheOn;


/**
 *  sessionKey，默认session
 */
@property (nonatomic, copy) NSString *sessionKey;

/**
 *  api 版本号的key,默认空，即为不启用
 */
@property (nonatomic, copy) NSString *apiVersionKey;

/**
 *  deviceID的key,默认空，即为不启用
 */
@property (nonatomic, copy) NSString *deviceIDKey;

/**
 *  osTag的key,标识是iOSx.x.x访问接口，默认空，即为不启用
 */
@property (nonatomic, copy) NSString *osTagKey;

/**
 *  app version的key，默认空，即为不启用
 */
@property (nonatomic, copy) NSString *appVersionKey;

/**
 *  api 的版本号,默认1.0
 */
@property (nonatomic, copy) NSString *apiVersion;

/**
 *  是否开启MD5签名，默认NO
 */
@property (nonatomic, assign) BOOL md5SignOn;

/**
 *  签名的key，默认sign
 */
@property (nonatomic, copy) NSString *md5SignKey;

/**
 *  给接口做MD5签名的时候用到，防止被其他人拿到接口修改参数获取更多其他数据，默认molon
 */
@property (nonatomic, copy) NSString *md5SignSecret;

/**
 *  请求超时时间,默认10秒
 */
@property (nonatomic, assign) double requestTimeoutInterval;

/**
 *  有文件上传的时候超时时间,默认120.0f
 */
@property (nonatomic, assign) double uploadTimeoutInterval;


@end